package ar.edu.utn.frre.sistop.simumem.fragments;

import java.text.DecimalFormat;
import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import ar.edu.utn.frre.sistop.simumem.R;
import ar.edu.utn.frre.sistop.simumem.model.Proceso;
import ar.edu.utn.frre.sistop.simumem.model.Resultado;

public class StatisticsDialogFragment extends DialogFragment {

	private ListView mStatistics;
	private TextView mAverageReturnTime;
	private TextView mAverageWaitTime;
	private StatisticAdapter mAdapter;
	private Resultado mResultado;
	private ArrayList<Proceso> mProcesos;

	public StatisticsDialogFragment(Resultado resultado, ArrayList<Proceso> procesos) {
		this.mResultado = resultado;
		this.mProcesos = procesos;
	}

	@SuppressLint("InflateParams")
	@Override
	@NonNull
	public Dialog onCreateDialog(Bundle savedInstanceState) {
		AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
		LayoutInflater inflater = getActivity().getLayoutInflater();

		View v = inflater.inflate(R.layout.dialog_statistics, null);
		builder.setView(v);

		String title = getResources().getString(R.string.titleStatistics);
		builder.setTitle(title).setNeutralButton(android.R.string.ok, new OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {
				dialog.dismiss();
			}
		});

		mAdapter = new StatisticAdapter(getActivity(), mProcesos, mResultado);
		mStatistics = (ListView) v.findViewById(R.id.list_statistics);
		mStatistics.setAdapter(mAdapter);

		DecimalFormat df = new DecimalFormat("#0.00");
		// Calculemos el tiempo promedio de retorno, iterando por los tiempos de retorno de cada
		// proceso
		long tiempoRetornoPromedio = 0;
		for (long tiempoRetornoProceso : mResultado.getTiemposRetorno().values()) {
			tiempoRetornoPromedio += tiempoRetornoProceso;
		}
		String returnTime = df.format((double) tiempoRetornoPromedio / mProcesos.size());
		mAverageReturnTime = (TextView) v.findViewById(R.id.tvStatistics_averageReturnTime);
		mAverageReturnTime.setText(returnTime);

		// Lo mismo para el tiempo de espera
		long tiempoEsperaPromedio = 0;
		for (long tiempoEsperaProceso : mResultado.getTiemposEspera().values()) {
			tiempoEsperaPromedio += tiempoEsperaProceso;
		}
		String waitTime = df.format((double) tiempoEsperaPromedio / mProcesos.size());
		mAverageWaitTime = (TextView) v.findViewById(R.id.tvStatistics_averageWaitTime);
		mAverageWaitTime.setText(waitTime);

		return builder.create();
	}
}
